Secret Managerでのタグによる条件付きアクセスを試してみる
はじめに
データアナリティクス事業本部のkobayashiです。
Google CloudのSecret Managerでのタグによる条件付きアクセスがプレビューになっていたので早速試してみましたのでその内容をまとめます。
タグと条件付きアクセス
Google Cloudのタグによる条件付きアクセスは、リソースに付与されたKey-Valueペアのタグを使用してアクセス制御を行う機能です。IAMポリシーにタグベースの条件を設定しリソースのタグと照合することで、きめ細かいアクセス管理が可能になります。
主な用途としては、環境別(開発、本番など)、部門別、プロジェクト別のアクセス制御があります。使用するにはリソースへのタグ付けとIAMポリシーでのタグ条件設定が必要になります。
Secret Managerでタグと条件付きアクセスを試してみる
では早速Secret Managerでのタグによる条件付きアクセスを試してみます。
タグを作成する
初めにタグを作成します。タグの作成は先にタグキーを作り次にタグキーにタグ値を追加する必要があります。
タグキーの作成
$ gcloud resource-manager tags keys create sm_tag_test --parent=projects/{プロジェクトID}
createTime: '2024-09-12T19:23:57.530953Z'
etag: laHOCbDLqcrrPqEZR0Fz/g==
name: tagKeys/281477277341964
namespacedName: {プロジェクトID}/sm_tag_test
parent: projects/1234567890
shortName: sm_tag_tssssst
updateTime: '2024-09-12T19:23:57.530953Z'
タグキーにタグ値を追加します。検証用にhigh
とlow
の2つのタグ値を作成します。
$ gcloud resource-manager tags values create high --parent={プロジェクトID}/sm_tag_test
createTime: '2024-09-12T19:25:14.474377Z'
etag: UdZYfe9MpTv8l60yEAftUA==
name: tagValues/281475359162578
namespacedName: {プロジェクトID}/sm_tag_test/high
parent: tagKeys/281477277341964
shortName: low
updateTime: '2024-09-12T19:25:14.474377Z'
$ gcloud resource-manager tags values create low --parent={プロジェクトID}/sm_tag_test
createTime: '2024-09-12T19:44:27.201750Z'
etag: C/vDBXGXx/d7r5tgwbqZQg==
name: tagValues/281478255664642
namespacedName: {プロジェクトID}/sm_tag_test/low
parent: tagKeys/281480072062176
shortName: low
updateTime: '2024-09-12T19:44:27.201750Z'
Secret Managerにタグを付与する
作成したタグをSecret Managerのリソースに付与します。
初めにSecret Managerのリソースを作成します。
シークレットを作成します。
$ gcloud secrets create secret_manager_test_high --replication-policy="automatic"
Created secret [secret_manager_test_high].
次にシークレットバージョンを追加します。
$ echo "1234567890abcdef" | gcloud secrets versions add secret_manager_test_high --data-file=-
Created version [1] of the secret [secret_manager_test_high].
これでSecret Managerのリソースが作成できたのでこのリソースにタグを付与します。
$ gcloud resource-manager tags bindings create \
--tag-value={プロジェクトID}/sm_tag_test/high \
--parent=//secretmanager.googleapis.com/projects/1234567890/secrets/secret_manager_test_high
done: true
response:
'@type': type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding
name: tagBindings/%2F%2Fsecretmanager.googleapis.com%2Fprojects%2F1234567890%2Fsecrets%2Fsecret_manager_test_high/tagValues/281482978432588
parent: //secretmanager.googleapis.com/projects/1234567890/secrets/secret_manager_test_high
tagValue: tagValues/281482978432588
tagValueNamespacedName: {プロジェクトID}/sm_tag_test/high
これでシークレットにタグが付与できたので一応確認してみます。
$ gcloud resource-manager tags bindings list --parent=//secretmanager.googleapis.com/projects/1234567890/secrets/secret_manager_test_high
---
name: tagBindings/%2F%2Fsecretmanager.googleapis.com%2Fprojects%2F1234567890%2Fsecrets%2Fsecret_manager_test_high/tagValues/281482978432588
parent: //secretmanager.googleapis.com/projects/1234567890/secrets/secret_manager_test_high
tagValue: tagValues/281482978432588
IAMに条件付きロールを付与する
タグが作成できたのでこのタグにアクセスできるようにプリンシパルに条件付きのロールを付与してアクセスが制限できるかを確かめてみます。
初めにシークレットのリソースに付与していないタグ値にアクセスできる条件付きポリシーを付与してみます。
$ gcloud projects add-iam-policy-binding {プロジェクトID} \
--member="serviceAccount:bigquery-1@{プロジェクトID.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor" \
--condition="^:^expression=resource.matchTag('{プロジェクトID/sm_tag_test','low'):title=Access only to sm_tag_test/low:description=Grants access only to resources with specified tag"
この状態でシークレットを取得してみます。
$ gcloud secrets versions access latest --secret=secret_manager_test_high
ERROR: (gcloud.secrets.versions.access) PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/{プロジェクトID/secrets/secret_manager_test_high/versions/latest' (or it may not exist). This command is authenticated as kobayashi.masahiro@classmethod.jp which is the active account specified by the [core/account] property. Impersonation is used to impersonate bigquery-1@{プロジェクトID}.iam.gserviceaccount.com.
想定通りエラーとなります。
次にシークレトに設定してあるタグ値にアクセスできる条件付きポリシーを付与します。
$ gcloud projects add-iam-policy-binding {プロジェクトID} \
--member="serviceAccount:bigquery-1@{プロジェクトID.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor" \
--condition="^:^expression=resource.matchTag('{プロジェクトID/sm_tag_test','high'):title=Access only to sm_tag_test/high:description=Grants access only to resources with specified tag"
この状態でシークレットを取得してみます。
$ gcloud secrets versions access latest --secret=secret_manager_test_high
1234567890abcdef
シークレットが取得できました。
まとめ
Google CloudのSecret Managerでのタグによる条件付きアクセスを試してみました。IAMポリシーにタグベースの条件を設定しリソースのタグと照合することできめ細かいアクセス管理が可能になるので非常に便利です。
最後まで読んで頂いてありがとうございました。